package logger

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"runtime/debug"
)

func Debug(msg string, fields ...zapcore.Field) {
	if lg != nil && !lg.off {
		lg.zapLogger.Debug(msg, fields...)
	}
}

func Info(msg string, fields ...zapcore.Field) {
	if lg != nil && !lg.off {
		lg.zapLogger.Info(msg, fields...)
	}
}

func Warn(msg string, fields ...zapcore.Field) {
	if lg != nil && !lg.off {
		lg.zapLogger.Warn(msg, fields...)
	}
}

func Error(msg string, fields ...zapcore.Field) {
	if lg != nil && !lg.off {
		lg.zapLogger.Error(msg, fields...)
	}
}

func Fatal(msg string, fields ...zapcore.Field) {
	if lg != nil && !lg.off {
		lg.zapLogger.Fatal(msg, fields...)
	}
}

func Panic(msg string, fields ...zapcore.Field) {
	if lg != nil && !lg.off {
		lg.zapLogger.Panic(msg, fields...)
	}
}

func Debugf(fmt string, args ...interface{}) {
	if lg != nil && !lg.off {
		lg.zapSuger.Debugf(fmt, args...)
	}
}

func Infof(fmt string, args ...interface{}) {
	if lg != nil && !lg.off {
		lg.zapSuger.Infof(fmt, args...)
	}
}

func Warnf(fmt string, args ...interface{}) {
	if lg != nil && !lg.off {
		lg.zapSuger.Warnf(fmt, args...)
	}
}

func Errorf(fmt string, args ...interface{}) {
	if lg != nil && !lg.off {
		lg.zapSuger.Errorf(fmt, args...)
	}
}

func Fatalf(fmt string, args ...interface{}) {
	if lg != nil && !lg.off {
		lg.zapSuger.Fatalf(fmt, args...)
	}
}

func Panicf(fmt string, args ...interface{}) {
	if lg != nil && !lg.off {
		lg.zapSuger.Panicf(fmt, args...)
	}
}

func Recover(onRecovers ...func(e ...interface{})) {
	if err := recover(); err != nil {
		if lg != nil && !lg.off {
			lg.zapLogger.Error("Panic Recover", zap.Any("Error", err))
		}
		debug.PrintStack()
		for _, onRecover := range onRecovers {
			onRecover(err)
		}
	}
}

func RecoverPanic() {
	if err := recover(); err != nil {
		if lg != nil && !lg.off {
			lg.zapLogger.Error("Panic Recover", zap.Any("Error", err))
		}
		debug.PrintStack()
	}
}
